需求說明
在資料庫的 Audit (稽核) 部份,需要有一套如同 SQL Server 的方式來執行。
MariaDB Server Audit Plugin
好在 MariaDB 有 Server Audit Plugin,相關文件在此。
開起來很簡單,設定也很容易。
MariaDB Server Audit Plugin 與 SQL Sever Trace File Audit 的比較
SQL Server 的 Audit 是用 Trace File 來儲存 Audit 資料,以下用一個表格做一個比較
| 項目 | SQL Server Trace File Audit | MariaDB Server Audit Plugin |
|---|---|---|
| 儲存方式 | Binary File 自有格式 | Text File (逗號隔開), syslog |
| 取用方式 | fn_trace_gettable() 取得資料 |
打開檔案或是 syslog client |
| 紀錄分類方式與數量 | 20 種 Class,每個 Class 數個 Events (2012.aspx)) | 8 種 (CONNECT, QUERY, READ, WRITE, CREATE, ALTER, RENAME, DROP) |
| 資料的控制 | sp_trace_* 設定人事時地物,檔案需要自己處理 |
server_audit_* 設定人事時地物,有 rotate 設定 |
設定說明
在文件裡 Logging events 一節提到的可設定的 Type,說明如下
CONNECT就是連線訊息QUERY執行 SQL 指令與結果代碼TABLE哪些 Tables 因此QUERY而受影響QUERY_DDLDDL 的 Query,是QUERY的子集合QUERY_DMLDML 的 Query,是QUERY的子集合QUERY_DCLDCL 的 Query,是QUERY的子集合
什麼是預設的 DDL, DML, DCL 的 Query 呢? 這邊要看 Code 才知道,因為後續會有改程式碼的動作,所以到時一併說明之。
另外一個部份是 Output 的 Operation 欄位,有 CONNECT, QUERY, READ, WRITE, CREATE, ALTER, RENAME, DROP,這部份的詳細定義也是要看 Code。
客製化 Server Audit Plugin
原來的 Server Audit Plugin 其實大部份的需求都可以達成了,如果有自己做 Log Server 的需求,需要更細緻的分類,因為有些資訊可以延遲送出(如日報表),但是特權帳號的使用要馬上通報給其他長官,光只有這 8 種情形無法滿足需求。
針對 DDL 與 DCL 加入更細緻的分類
這邊先來看看 MariaDB 對於 DDL 與 DCL 是怎麼判斷的,首先到官網下載原始碼 (如 10.1.17),不要到 github 上抓,因為那太新了。
Code 分析與修改
到 plugin\server_audit\server_audit.c 找到以下程式碼
1 | enum sa_keywords |
以上可以看的的出來 DDL 是哪些會算,哪些不會算,譬如說 DROP, DROP User 算是 DDL,但是 DROP Function 不算 DDL。
1 |
|
這邊可以看得出來 DML。
1 | struct sa_keyword dcl_keywords[]= |
這邊可以看得出來 DCL。1
2
3
4
5
6
7
8
9
10
11
struct sa_keyword passwd_keywords[]=
{
{3, "SET", &password_word, SQLCOM_SET_OPTION},
{5, "ALTER", &server_word, SQLCOM_ALTER_SERVER},
{5, "GRANT", 0, SQLCOM_GRANT},
{6, "CREATE", &user_word, SQLCOM_CREATE_USER},
{6, "CREATE", &server_word, SQLCOM_CREATE_SERVER},
{6, "CHANGE", &master_word, SQLCOM_CHANGE_MASTER},
{0, NULL, 0, SQLCOM_NOTHING}
};
這邊說明什麼時候會碰到密碼 (在 log 裡會紀錄動作,然後把密碼用星號表示)。
接下來找到以下的程式碼
1 | static int log_statement_ex(const struct connection_info *cn, |
這邊的 Code 說明有許多的紀錄後來會被標記成 QUERY,如果要利用原來已經分類的 DCL 與 DDL 架構,這邊就要先來利用一下。
1 | static int log_statement_ex(const struct connection_info *cn, |
Build Plugin
接下來要來 Build Plugin,根據這個文件,安裝該安裝的函式庫與工具,以下紀錄一下
- Visual Studio 2015 Community 版
- Bison (記得路徑不要有空白)
- cmake
- Windows SDK 8.1 (這個現在沒裝沒關係,等會可以裝)
Build 方式,在 Source 底下
mkdir bldcd bldcmake .. -G "Visual Studio 14 2015 Win64"(64 位元版)cmake --build . --config Relwithdebinfo
會碰到的錯 (然後會有一大堆的 warning)
Windows SDK 8.1 沒裝
這個要去
bld底下用 IDE 開MySQL.sln,打開的時候他會說你的 SDK 缺少,要不要下載安裝,讓他自己跑完就可以了。sql\sql_locale.cc有怪字無法編譯我查到的結果都是開 notepad++ 去改 utf-8,不過我做完還是失敗,後來是開 notepad 然後用 unicode 儲存 (不是 utf-8 喔) 就可以過了。
測試
把 MariaDB 停掉,從 bld\plugin\server_audit\RelWithDebInfo 把 dll 跟 pdb 複製到 MariaDB\lib 下,重開看看。
原來的 log 大概像這樣1
20161003 13:15:58,WSTest,sujunmin,localhost,98,783,QUERY,test1,'REVOKE RELOAD ON *.* FROM \'lsuser\'@\'%\'',0
應該會變成這樣1
20161003 16:31:14,WSTest,sujunmin,localhost,98,783,QUERY_DCL,test1,'REVOKE RELOAD ON *.* FROM \'lsuser\'@\'%\'',0
後續的 Log Parser 就可以根據這些關鍵字來分析使用了。